/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import java.util.logging.Level;
import java.util.logging.Logger;

import org.springframework.stereotype.Service;

import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOVentaFacturacion;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.scp.entidad.VentaLineaCreditoDetalle;
import pe.com.cotelasa.seguridad.common.util.Constantes.EstadoRegistro;

/**
 *
 * @author Jorge
 */
@Service
public class ServicioVentaFacturacionImpl implements IServicioVentaFacturacion, Serializable {

    @Inject
    private IDAOVentaFacturacion daoVentaFacturacion;

    @Override
    public ResultadoServicio guardarVentaFacturacion(VentaFacturacion ventaFacturacion) {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {
            ventaFacturacion.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            resultadoServicio.setID(daoVentaFacturacion.insert(ventaFacturacion));
            resultadoServicio.setMensaje("Se guardo el documento satisfactoriamente.");
        } catch (Exception ex) {
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio
                    .setMensaje("Ocurrio un problema al tratar de guardar el documento. Vuelva a intentar");
            Logger.getLogger(ServicioVentaFacturacionImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public ResultadoServicio actualizarVentaFacturacion(VentaFacturacion ventaFacturacion) {
        ResultadoServicio resultadoServicio = new ResultadoServicio(ESTADO_RESULTADO.EXITOSO);
        try {

            daoVentaFacturacion.actualizar(ventaFacturacion);
            resultadoServicio.setMensaje("Se guardo el documento satisfactoriamente.");
        } catch (Exception ex) {
            ex.printStackTrace();
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio
                    .setMensaje("Ocurrio un problema al tratar de guardar el documento. Vuelva a intentar");
            Logger.getLogger(ServicioVentaFacturacionImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resultadoServicio;
    }

    @Override
    public List<VentaFacturacion> obtenerVentaFacturacionBusqueda(VentaFacturacion ventaFacturacion, Date fechadel, Date fechaal) throws ServiceException {
        try {
            return daoVentaFacturacion.obtenerVentaFacturacionBusqueda(ventaFacturacion, fechadel, fechaal);
        } catch (DAOException ex) {
            ex.printStackTrace();
            Logger.getLogger(ServicioVentaFacturacionImpl.class.getName()).log(Level.SEVERE, null, ex);
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public List<VentaFacturacion> listarTodos() throws ServiceException {
        try {
            return new ArrayList<VentaFacturacion>(daoVentaFacturacion.listarTodos(VentaFacturacion.class));
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public int obtenerIdMonedaFacturacion(Integer idVentaFacturacion) throws ServiceException {
        try {
            return daoVentaFacturacion.obtenerIdMonedaFacturacion(idVentaFacturacion);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }

    @Override
    public int obtenerIdFormaPagoFacturacion(Integer idVentaFacturacion) throws ServiceException {
        try {
            return daoVentaFacturacion.obtenerIdFormaPagoFacturacion(idVentaFacturacion);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }

    @Override
    public int obtenerIdMotivoTrasladoFacturacion(Integer idVentaFacturacion) throws ServiceException {
        try {
            return daoVentaFacturacion.obtenerIdMotivoTrasladoFacturacion(idVentaFacturacion);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }

    @Override
    public void eliminarDetalleFactura(Integer idVentaFacturacion) throws ServiceException {
        try {
            daoVentaFacturacion.eliminarDetalleFactura(idVentaFacturacion);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }

    @Override
    public List<VentaFacturacion> listarFacturacionTipo(Integer tipo) throws ServiceException {
        try {
            return daoVentaFacturacion.listarFacturacionTipo(tipo);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }

    @Override
    public int obtenerIdTipoDocumento(Integer idVentaFacturacion) throws ServiceException {
        try {
            return daoVentaFacturacion.obtenerIdTipoDocumento(idVentaFacturacion);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }

    @Override
    public VentaFacturacion obtenerFacturacion(Integer idVentaFacturacion) throws ServiceException {
        try {
            return daoVentaFacturacion.obtenerEntidadPorId(VentaFacturacion.class, idVentaFacturacion);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public List<VentaFacturacion> listarFacturacionPendientes(Integer tipo, Integer formapago, Integer idCliente, Character estado, Integer idSede)
            throws ServiceException {
        try {
            return daoVentaFacturacion.listarFacturacionPendientes(tipo, formapago, idCliente, estado, idSede);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }

    @Override
    public List<VentaFacturacion> obtenerFacturasRV(String inicio, String fin, Integer idSede) throws ServiceException {
        try {
            return daoVentaFacturacion.obtenerFacturasRV(inicio, fin, idSede);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }

    }

    @Override
    public boolean esNumeroDocCorrecta(VentaFacturacion ventaFacturacion) throws ServiceException {
        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("serieFactura", ventaFacturacion.getSerieFactura());
            parametro.put("numFactura", ventaFacturacion.getNumFactura());
            parametro.put("tipoCompago", ventaFacturacion.getTipoCompago());
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());

            if (daoVentaFacturacion.obtenerColeccionEntidadPorFiltros(VentaFacturacion.class, parametro).size() > 0) {
                return true;
            } else {
                return false;
            }

        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public List<VentaFacturacion> obtenerGuiasParaFactura(VentaFacturacion ventaFacturacion) throws ServiceException {

        try {
            return daoVentaFacturacion.obtenerGuiasParaFactura(ventaFacturacion);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public List<VentaFacturacion> obtenerFacturasExportacionReporte(VentaFacturacion ventaFacturacion) throws ServiceException {

        try {
            return daoVentaFacturacion.obtenerFacturasExportacionReporte(ventaFacturacion);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public List<VentaFacturacion> obtenerGuiasDeFactura(int idVentaFacturacion) throws ServiceException {

        try {
            Map<String, Object> parametro = new HashMap<String, Object>();
            parametro.put("coddocbase", idVentaFacturacion);
            parametro.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
            return (List<VentaFacturacion>) daoVentaFacturacion.obtenerColeccionEntidadPorFiltros(VentaFacturacion.class, parametro);


        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<VentaFacturacion> obtenerGuiasPorSerie(VentaFacturacion ventaFacturacion, Date fechaInicio, Date fechaFinal, int idEmpresa) throws ServiceException {
        try {
            return daoVentaFacturacion.obtenerGuiasPorSerie(ventaFacturacion, fechaInicio, fechaFinal, idEmpresa);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
    
    @Override
    public Collection<VentaFacturacion> obtenerFacturasVentaParaLetras(
    		VentaFacturacion ventaFacturacion) throws ServiceException {
    	try {
    		String tipoPago  = "LETRA";
			String estadoCancelacion = String.valueOf(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
			return daoVentaFacturacion.buscarFacturasParaLetras(ventaFacturacion.getCodCliente().getId(),ventaFacturacion.getMoneda().getId(),tipoPago,estadoCancelacion,EstadoRegistro.ESTADO_REGISTRO_ACTIVO);
		} catch (Exception e) {
			throw new ServiceException(e.getMessage(),e);
		}
    }
    
    @Override
    public Collection<VentaFacturacion> obtenerVentaFacturacion(
    		VentaFacturacion ventaFacturacion) throws ServiceException {
    	try {
			String estadoCancelacion = String.valueOf(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
			return daoVentaFacturacion.obtenerVentaFacturacion(ventaFacturacion.getCodCliente().getId(),ventaFacturacion.getMoneda().getId(),estadoCancelacion,EstadoRegistro.ESTADO_REGISTRO_ACTIVO,ventaFacturacion.getNumFactura());
		} catch (Exception e) {
			throw new ServiceException(e.getMessage(),e);
		}
    }

    @Override
    public void cancelarFactura(VentaFacturacion ventaFacturacion)
    		throws ServiceException {
    	try {
    		VentaFacturacion ventaFacturacionUpdate = daoVentaFacturacion.obtenerEntidadPorId(VentaFacturacion.class,ventaFacturacion.getCoddocventa());
    		ventaFacturacionUpdate.setFecCancelacion(ventaFacturacion.getFecCancelacion());
    		ventaFacturacionUpdate.setEstado(COLOR_ESTADO_VENTA.PAGADA.getEstado());
    		daoVentaFacturacion.actualizar(ventaFacturacionUpdate);
		} catch (Exception e) {
			throw new ServiceException(e.getMessage(),e);
		}
    }
}
